package extend.db.entity;

import extend.db.entity.annotation.EntityMetadata;
import java.util.HashMap;
import java.util.Map;

/**
 * 实体转换类
 * <B>说明：</B>
 * <pre>
 *  略
 * </pre>
 * <B>示例：</B>
 * <pre>
 *  略
 * </pre>
 * <B>日志：</B>
 * <pre>
 *  略
 * </pre>
 * <B>注意事项：</B>
 * <pre>
 *  略
 * </pre>
 */
public class Entity
{
    public static final String WHERE_NAME = "where";
    public static final String DATA_NAME = "data";

    protected static Map<Class,EntityMetadata> entitysCache = new HashMap<>();

    public static EntityMetadata getEntity(Object entity)
    {
        return getEntity(entity.getClass());
    }

    /**
     * 获取实体描述对象
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public static EntityMetadata getEntity(Class clazz)
    {
        if (entitysCache.containsKey(clazz)) {
            return entitysCache.get(clazz);
        }

        EntityMetadata entityMetadata = new EntityMetadata(clazz);
        entitysCache.put(clazz,entityMetadata);

        // 开始解析注解
        entityMetadata.parseAnnotation();

        return entitysCache.get(clazz);
    }

    /**
     * 设置实体属性值
     *<B>说明：</B>
     *<pre>
     *  　略
     *</pre>
     */
    public static void setAttrs(Object target,Map<String,Object> row)
    {
        EntityMetadata entityMetadata = getEntity(target.getClass());
        Map<String,Object> attrs = entityMetadata.toFieldValue(row);
        EntityReflectUtil.setAttrs(target,attrs);
    }

    /**
     * 实体转换dao 新增数据格式
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public static Map<String,Object> toAdd(Object target)
    {
        EntityMetadata entityMetadata = getEntity(target.getClass());

        return entityMetadata.toAdd(target);
    }

    /**
     * 实体转换dao更新数据格式
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public static  Map<String,Map<String,Object>> toUpdate(Object target)
    {
        EntityMetadata entityMetadata = getEntity(target.getClass());

        return entityMetadata.toUpdate(target);
    }

    /**
     * 实体转换dao删除数据格式
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public static Map<String,Object> toDelete(Object target)
    {
        EntityMetadata entityMetadata = getEntity(target.getClass());

        return entityMetadata.toDelete(target);
    }

}
